package com.ipartek.formacion.migracion9.main;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.SQLException;

import org.apache.log4j.Logger;

import com.ipartek.formacion.migracion9.beans.Persona;
import com.ipartek.formacion.migracion9.ddbb.DAOFactory;
import com.ipartek.formacion.migracion9.ddbb.MySqlDAOFactory;
import com.ipartek.formacion.migracion9.excepciones.PersonaException;
import com.ipartek.formacion.migracion9.interfaces.InterfacePersonaDAO;

/**
 * Clase que migra el fichero personas.txt a una base de datos mySql, generando
 * logs con los errores y registros insertados.
 * 
 * @author Equipo a9, fila 3
 * 
 */
public class Migracion {

	// ATRIBUTOS DE CONEXION
	private static DAOFactory myDao = DAOFactory
			.getDAOFactory(DAOFactory.MYSQL);

	// DAO ALUMNOS
	public static InterfacePersonaDAO personaDAO = myDao
			.getInterfacePersonaDAO();

	private static final Logger log = Logger.getLogger(MySqlDAOFactory.class);
	private static final String PATH_FICHERO = "data/personas.txt";
	private static final String PATH_LOGDEBUG = "log/report-debug.log";
	private static final String PATH_LOGERROR = "log/report-error.log";
	private static final String PATH_LOGINFO = "log/report-info.log";
	private static final String PATH_LOGTRACE = "log/report-trace.log";
	private static File fichero = new File(PATH_FICHERO);
	private static File logdebug = new File(PATH_LOGDEBUG);
	private static File logerror = new File(PATH_LOGERROR);
	private static File loginfo = new File(PATH_LOGINFO);
	private static File logtrace = new File(PATH_LOGTRACE);
	private static FileReader fr;
	private static BufferedReader br;

	public static void main(String[] args) {
		String linea = "";
		String datos[];
		Persona p = null;
		String dPersona = "";
		int lineas = 0;
		int personasValidas = 0;
		int personasNoValidas = 0;
		logdebug.delete();
		logerror.delete();
		loginfo.delete();
		logtrace.delete();
		try {
			fr = new FileReader(fichero);
			br = new BufferedReader(fr);
			long ini = System.currentTimeMillis();
			personaDAO.conectar();
			personaDAO.borrar();
			while ((linea = br.readLine()) != null) {
				lineas++;
				datos = linea.split(",");
				try {
					dPersona = datos[0] + ", " + datos[1] + ", " + datos[2]
							+ ", " + datos[3] + ", " + datos[5] + ", "
							+ datos[4] + ", " + datos[6];
					try {
						p = new Persona(datos[0], datos[1], datos[2],
								Integer.parseInt(datos[3]), datos[5], datos[4],
								datos[6]);
						try {
							personaDAO.anadirPersona(p);
							personasValidas++;
						} catch (SQLException e) {
							log.error("Se ha producido el siguiente error: "
									+ e.getMessage());
							personasNoValidas++;
						}
					} catch (NumberFormatException e) {
						log.error("Formato de edad erroneo " + dPersona);
						personasNoValidas++;
					} catch (PersonaException e) {
						log.error(e.getMensajeError() + " " + dPersona);
						personasNoValidas++;
					}
				} catch (ArrayIndexOutOfBoundsException e) {
					log.error("La persona no contiene todos los datos "
							+ datos[0] + " " + datos[1] + " " + datos[2]);
					personasNoValidas++;
				}
			}
			log.trace("Se ha recorrido " + lineas
					+ " lineas, de las cuales hay " + personasValidas
					+ " personas validas y " + personasNoValidas
					+ " personas no validas.");
			personaDAO.comitar();
			long fin = System.currentTimeMillis();
			log.trace("El proceso ha durado: " + (fin - ini) + "ms");
		} catch (FileNotFoundException e1) {
			log.error("El fichero no se ha encontrado.");
		} catch (IOException e) {
			log.error(e.getMessage());
		}
	}
}
